package org.itsky.study.test5;

/**
 * @Author sky
 * @Site cmtianxie163.com 2020/4/16 16:56
 */

public class SingletonTest1 {
    public static void main(String[] args) {
        System.out.println(Thread.currentThread().getName() + "正在运行...");


        Bank bank1 = Bank.getBank();
        Bank bank2 = Bank.getBank();
        System.out.println(bank1 == bank2);
    }
}

/**
 * 饿汉式
 * <p>
 * 懒汉式
 * <p>
 * 存在线程安全问题
 * <p>
 * 懒汉式
 * <p>
 * 存在线程安全问题
 * <p>
 * 懒汉式
 * <p>
 * 存在线程安全问题
 */
//class Bank {
//    //私有化构造方法
//    private Bank() {
//    }
//    private static Bank instance = new Bank();
//    //提供公共的方法获取Bank类的实例对象
//    public static Bank getBank() {
//        return instance;
//    }
//}


/**
 * 懒汉式
 * <p>
 * 存在线程安全问题
 */
//class Bank {
//    //私有化构造方法
//    private Bank() {
//    }
//
//    private static Bank instance = null;
//
//    //提供公共的方法获取Bank类的实例对象
//    public static Bank getBank() {
//        if (instance == null) {
//            instance = new Bank();
//        }
//        return instance;
//    }
//}


/**
 * 懒汉式
 * <p>
 * 解决线程安全问题
 */
class Bank {
    //私有化构造方法
    private Bank() {
    }

    private static Bank instance = null;

    //提供公共的方法获取Bank类的实例对象
    /**
     * 效率低
     */
//    public static synchronized Bank getBank() {
//        if (instance == null) {
//            instance = new Bank();
//        }
//        return instance;
//    }

    /**
     * 优化
     * @return
     */
    public static Bank getBank() {
        if (instance == null) {
            synchronized (Bank.class) {
                if (instance == null) {
                    instance = new Bank();
                }
            }
        }
        //因为当instance不为null时，不会造成 重复创建Bank对象的问题
        return instance;
    }
}